Математическое моделирование. Лабораторная Работа №1

Работа с git

Барсегян В.Л.

Российский университет дружбы народов им. Патриса Лумумбы, Москва, Россия

22 февраля 2025

Информация

Докладчик

Вводная часть

Цели и задачи

  • Знакомство с системой контроля версий git

Выполнение лабораторной работы

Подготовка

  1. Настроим параметры установки окончаний строк и отображения unicode для устройства Linux. После, в папке hello создадим файл hello.html с содержимым, и инициализируем пустой git-репозиторий
Настройка git, инициализация репозитория

Создание проекта и внесение изменений

  1. Добавим файл в репозиторий.
    Проверим текущее состояние репозитория командой git status
Добавление файла в репозиторий и проверка состояния репозитория

Индексация изменений

  1. Текущее содержимое файла hello.html
hello.html

Индексация изменений

  1. Индексирую изменения командой git add hello.html и проверяю. Теперь изменения проиндексированы.
    Коммичу изменения командой git commit и снова проверяю
Индексация и коммит изменений

Индексация изменений

  1. Обновляю содержимое hello.html
hello.html

Индексация изменений

  1. Добавляю это изменение в индекс командой git add hello.html. Снова обновляю hello.html
Обновление hello.html

Индексация изменений

  1. Проверяю текущие изменения. Добавляю последние изменения и коммичу. Снова проверяю статус
Проверка статуса и коммит

Индексация изменений

  1. Добавляю второе изменение в индекс и проверяю
Добавление второго изменения в индекс, проверка

История

  1. Получим список изменений командой git log
    Для однострочного формата введем git log –pretty=oneline
Список изменений

История

  1. Выведем справочную информацию командой man git-log
man git-log

История

  1. Ввожу команду git checkout , где хэш - хэш первого коммита. Также просматриваю содержимое файла - оно равняется содержимому первого коммита
Переход к первому коммиту

История

  1. Перехожу к последней версии ветки командой git checkout master и просматриваю содержимое файла - теперь оно актуальное. Создаю тег первой версии командой git tag v1. Перехожу к версии, предшествующей v1, командой git checkout v1^.
Переход к последней версии и создание тега v1

История

  1. Создаю для предшествующей версии тэг v1-beta. Перехожу к версии v1 и просматриваю все доступные тэги. Также просматриваю тэги в логе командой git log master –all
Создание тэга предшествующей версии, просмотр

Отмена локальных изменений (до индексации)

  1. Обновляю содержимое hello.html
hello.html

Отмена локальных изменений (до индексации)

  1. Проверяю состояние рабочего каталога (hello.html был изменен, но еще не проиндексирован).
    Командой git checkout переключаю версии файла hello.html в репозитории
    Команда git status показывает нам, что не было произведено никаких изменений, не зафиксированных в рабочем каталоге.
Проверка состояния каталога до и после индексации изменений

Отмена проиндексированных изменений (перед коммитом)

  1. Изменяю содержимое hello.html
hello.html

Отмена проиндексированных изменений (перед коммитом)

  1. Индексирую изменения командой git add hello.html. Проверяю состояние изменения, после чего сбрасываю буферную зону командой git reset HEAD hello.html. Переключаюсь на версию коммита командой git checkout hello.html и снова проверяю статус. Проверяю содержимой файла - изменений теперь нет.
Отмена проиндексированных изменений перед коммитом

Отмена коммитов

  1. Изменяю содержимое hello.html
hello.html

Отмена коммитов

  1. Индексирую изменения и коммичу их командой git commit -m “Oops, we didn’t want this commit”. Отменяю коммит командой git revert HEAD - в результате получаю такой коммит
Отмена коммита

Отмена коммитов

  1. Проверяю логи
Проверка логов

Удаление коммитов из ветки

  1. Отмечаю последний коммит тэгом командой git tag oops. Сбрасываю ветку до точки v1 командой git reset –hard v1. Проверяю логи - информация о двух последних коммитах пропала
Сброс ветки и проверка логов

Удаление коммитов из ветки

  1. Просматриваю все коммиты командой git log –all - здесь есть и последние два коммита
Все коммиты

Удаление тега oops

  1. Удаляю тэг oops командой git tag -d oops и проверяю
Удаление тэга

Внесение изменений в коммиты

  1. Изменяю содержимое hello.html
hello.html

Внесение изменений в коммиты

  1. Индексирую изменения и коммичу их. После, снова редактирую файл, добавляя почту, и коммичу изменения командой git commit –amend -m “Add an author/email comment”, т.е. изменяя последний коммит. Проверяю логи и вижу один новый коммит
Создание коммита и его изменение

Перемещение файлов

  1. Создаю папку lib и переношу страницу в каталог lib командой git mv. Проверяю изменения командой git status. Коммичу изменения
Перемещение файла в папку lib

Подробнее о структуре

  1. Создаю в корне файл index.html и заполняю его. Коммичу изменения
index.html

Git внутри: Каталог .git

  1. Просматриваю каталог со всей информацией о git командой ls -C .git. Выполняю команду ls -C .git/objects. Также просматриваю один из каталогов с именем из 2 букв. Просматриваю файл конфигурации командой cat .git/config
Просмотр каталога .git

Работа непосредственно с объектами git

  1. Выполняю команду cat .git/HEAD - содержится ссылка на ветку master. Просматриваю последний коммит командой git log –max-count=1. Также вывожу последний коммит с помощью хэша командой git cat-file
Просмотр последнего коммита

Работа непосредственно с объектами git

  1. Произвожу поиск дерева командой git cat-file, указав хеш дерева. Аналогично вывожу каталог lib и файл hello.html
Поиск по хэшу

Работа непосредственно с объектами git

  1. Исследую репозиторий самостоятельно: перехожу к последующему коммиту по хэшу родителя
Исследование репозитория

Создание ветки

  1. Создаю ветку командой git checkout -b style и проверяю ее статус. Создаю файл style.css в папке lib, заполняю его, индексирую и коммичу. Обновляю файл lib/hello.html, добавляя в него ссылку на css-файл, и также индексирую и коммичу изменения. Обновляю файл index.html, индексирую и коммичу изменения
Обновление файлов, индексация и коммиты

Навигация по веткам

  1. Проверяю логи последних коммитов, вижу все созданные коммиты, они в ветке style
Проверка логов

Навигация по веткам

  1. Перехожу в ветку master и просматриваю содержимое файла lib/hello.html - в нем нет последних изменений. Просматриваю тот же файл в ветке style - изменения есть
Проверка файла в разных ветках

Изменения в ветке master

  1. Перехожу в ветку master и создаю файл README.md командой echo “This is the Hello World example from the git tutorial.” > README.md. Коммичу изменения и просматриваю логи, включая различия между ветками.
Создание README в ветке master, проверка дерева веток

Слияние

  1. Перехожу в ветку style командой git checkout style. Сливаю master c style командой git merge master. Вывожу логи с деревом всех веток
Слияние master с style

Создание конфликта

  1. Возвращаюсь в ветку master и редактирую файл lib/hello.html. Коммичу изменения, просматриваю логи
Редактирование lib/hello.html в master

Разрешение конфликтов

  1. Перехожу в ветку style и пытаюсь слить master с style. В файле lib/hello.html возникли конфликты. Разрешаю конфликты и коммичу изменения
Разрешение конфликта

Сброс ветки style

  1. Перехожу в ветку style и просматриваю логи изменений
Логи изменений ветки style

Сброс ветки style

  1. Сбрасываю ветку к коммиту «Updated index.html» командой git reset –hard c использованием хэша коммита. Снова првоеряю лог ветки style
Сброс ветки style с помощью git reset

Сброс ветки master

  1. Перехожу в ветку master и аналогичным образом сбрасываю ее к коммиту «Added README». Просматриваю лог ветки master
Сброс ветки master

Перебазирование

  1. Перехожу в ветку style и использую вместо слияния команду git rebase master. Просматриваю лог ветки.
Перебазирование ветки

Слияние в ветку master

  1. Перехожу в ветку master и сливаю style c master. Просматриваю лог - теперь ветки style и master идентичны.
Слияние style c master

Клонирование репозиториев и просмотр клонированного репозитория

  1. Перехожу в родительский каталог. Создаю клон репозитория hello в папке cloned_hello командой git clone hello cloned_hello. Перехожу в cloned_hello и просматриваю папки и файлы. Вывожу список всех коммитов командой git log –all
Создание и просмотр клонированного репозитория

Что такое origin? Удаленные ветки

  1. Выполняю команды git remote и git remote show origin для более подробнной информации. Просматриваю ветки, доступные в клонированном репозитории, командой git branch. Просматриваю все ветки командой git branch -а
git remote, просмотр веток

Изменение оригинального репозитория

  1. Редактирую README.md в репозитории hello и коммичу изменения. В клонированном репозитории выполняю git fetch для извлечения изменений, проверяю лог - вижу последний сделанный коммит
Редактирование оригинального репозитория и извлечение изменений в клонированном

Слияние извлеченных изменений

  1. Проверяю клонированный файл README.md - он не изменился. Выполняю слияние извлеченных изменений командой git merge origin/master. Снова проверяю содержимое файла - теперь оно обновилось.
Проверка файла до и после слияния изменений

Добавление ветки наблюдения

  1. Выполняю:
    git branch –track style origin/style
    git branch -a
    git log –max-count=2
    Теперь можно видеть ветку style в списке веток и логе
Добавление ветки наблюдения

Создание чистого репозитория, добавление удаленного репозитория

  1. Создаю чистый репозиторий командой git clone –bare hello hello.git и перехожу в него. Добавляю удаленный репозиторий командой git remote add shared ../hello.git. Редактирую файл README.md и отправляю изменения в общий репозиторий. В клонированном репозитории добавляю командой git remote add shared ../hello.git, и извлекаю сделанные изменения командой git pull shared master, проверяю файл
Создание чистого репозитория, добавление удаленного репозитория, извлечение общих изменений

Выводы

Я настроил git, научился с ним работать, узнал про различные ветки, слияние, перебазирование, чистые репозитории.